#include "Display_EPD_W21_spi.h"

// E-paper GPIO initialization
void EPD_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_EPD_InitConfig;

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // CS-->PA0   SCK-->PA6  SDO--->PA7
    GPIO_EPD_InitConfig.Pin = GPIO_PIN_0 | GPIO_PIN_6 | GPIO_PIN_7;
    GPIO_EPD_InitConfig.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_EPD_InitConfig.Pull = GPIO_PULLUP;
    GPIO_EPD_InitConfig.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_EPD_InitConfig);

    // D/C--->PB0  RES-->PB1
    GPIO_EPD_InitConfig.Pin = GPIO_PIN_0 | GPIO_PIN_1;
    HAL_GPIO_Init(GPIOB, &GPIO_EPD_InitConfig);

    // BUSY--->PB2
    GPIO_EPD_InitConfig.Pin = GPIO_PIN_2;
    GPIO_EPD_InitConfig.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(GPIOB, &GPIO_EPD_InitConfig);
}

// SPI write byte
void SPI_Write(unsigned char value) {
    unsigned char i;
    EPD_W21_CLK_0;
    for (i = 0; i < 8; i++) {
        if (value & 0x80)
            EPD_W21_MOSI_1;
        else
            EPD_W21_MOSI_0;
        EPD_W21_CLK_1;
        EPD_W21_CLK_0;
        value = value << 1;
    }
}

// SPI write command
void EPD_W21_WriteCMD(unsigned char command) {
    EPD_W21_CS_0;
    EPD_W21_DC_0; // D/C#   0:command  1:data
    SPI_Write(command);
    EPD_W21_CS_1;
}
// SPI write data
void EPD_W21_WriteDATA(unsigned char datas) {
    EPD_W21_CS_0;
    EPD_W21_DC_1; // D/C#   0:command  1:data
    SPI_Write(datas);
    EPD_W21_CS_1;
}
